/**
 * com.chaeron.GPS - An API for access to GPS devices.
*
*
* Copyright (c) 2001, 2002 Chaeron Corporation,
* All rights reserved.
* 
* Chaeron grants you a non-exclusive license to use, modify and re-distribute
* this program under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version, provided that this copyright notice and 
* license appear on all copies of the software.
* 
* Software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR
* IMPLIED REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. THE ENTIRE RISK ARISING OUT OF USING THE SOFTWARE IS ASSUMED
* BY THE LICENSEE. See the GNU General Public License for more details.
*
* CHAERON AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
* LICENSEE OR ANY THIRD PARTY AS A RESULT OF USING OR DISTRIBUTING SOFTWARE.
* IN NO EVENT WILL CHAERON OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE,
* PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL
* OR PUNITIVE DAMAGES, HOWEVER CAUSED AN REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF CHAERON HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

* @version     1.02
* @author      Andrzej Jan Taramina, Chaeron Corporation
*              andrzej@chaeron.com
*/

package com.chaeron.GPS.Garmin;

//***************************************************************************
//*
//*     Imports
//*
//***************************************************************************/

import com.chaeron.GPS.*;
import com.chaeron.GPS.event.*;
import com.chaeron.GPS.exception.*;


//***************************************************************************
//*
//*     XferCompleteGarminPacket Class definition
//*
//***************************************************************************/

/**
 * The XferCompleteGarminPacket class represents Xfer Complete Packets
*
*/

public class XferCompleteGarminPacket extends GarminPacket implements GPSXferComplete
{
	//***************************************************************************
	//*
	//*     Constant definitions
	//*
	//***************************************************************************/
	
	//***************************************************************************
	//*
	//*     Attributes
	//*
	//***************************************************************************/
	
	private Protocol		protocol					= null;
	
	private byte			commandID					= 0;
	
	//***************************************************************************
	//*
	//*     Constructors
	//*
	//***************************************************************************/
	
	/**
	 * Create a XferCompleteGarminPacket from the given packet data
	*
	* @param	protocol	current protocol
	* @param	len			length of packet data
	* @param	link		current Link Protocol
	*/
	
	XferCompleteGarminPacket( Protocol protocol, byte[] packet, int len )
	{  
		super( packet, len );
		
		this.protocol = protocol;
	}
	
	
	//***************************************************************************
	//*
	//*     decode method
	//*
	//***************************************************************************/
	
	/**
	 * Decode the data fields.
	*
	 * @throws GPSPacketException
	 * @throws GPSFunctionUnavailableException
	 */
	
	public void parseData() throws GPSPacketException, GPSFunctionUnavailableException
	{  
		if( getPacketIDByte() != protocol.getProtocolPacketID( Protocol.GARMIN_PID_XFER_COMPLETE ) ) {
			throw( new GPSPacketException( GPSPacketException.EXCEPTION_PACKETID_INVALID ) );
		} else if( getDataLength() != 2 ) {
			throw( new GPSPacketException( GPSPacketException.EXCEPTION_PACKETLENGTH_INVALID ) );
		} else {
			commandID = (byte)getGarminInt( 0 );
		}
	}
	
	
	//***************************************************************************
	//*
	//*     Packet Processing Methods
	//*
	//***************************************************************************/
	
	/**
	 * Process the packet
	*
	* @param	gps			the GPS object that requested the packet to be processed
	*/
	
	void process( GPS gps )
	{
		if( !isParsed() ) {
			try {
				parse();
				gps.postGPSEvent( new GPSEvent( GPSEvent.GPS_EVENT_XFER_COMPLETE, this ) );
			}
			catch( GPSException exception ) {
				gps.postGPSEvent( new GPSEvent( GPSEvent.GPS_EVENT_ERROR, toString(), exception ) );
			}
		}
	}
	
	
	/**
	 * Get events generated.
	*
	* @return		return a valid event type(s) that will be generated by this packet
	*/
	
	static int getEventsGenerated()
	{  
		return( GPSEvent.GPS_EVENT_ERROR | GPSEvent.GPS_EVENT_XFER_COMPLETE );
	}
	
	
	//***************************************************************************
	//*
	//*    Accessor methods
	//*
	//***************************************************************************/
	
	/**
	 * Get command ID
	*
	* @return		command ID for this completed xfer
	*/
	
	public byte getCommandID()
	{  
		return( commandID );
	}
	
	
	/**
	 * Get xfer type
	*
	* @return		xfer type
	*/
	
	public int getXferType()
	{  
		int		ret 	= GPSEvent.GPS_EVENT_UNDEFINED;
		
		switch( commandID ) {
				
			case Protocol.COMMAND_A010_XFER_WAYPOINTS:
			case Protocol.COMMAND_A011_XFER_WAYPOINTS:
				ret = GPSEvent.GPS_EVENT_WAYPOINT;
				break;
				
			case Protocol.COMMAND_A010_XFER_ROUTES:
			case Protocol.COMMAND_A011_XFER_ROUTES:
				ret = GPSEvent.GPS_EVENT_ROUTE_HEADER;
				break;
			
			case Protocol.COMMAND_A010_XFER_TRACKS:
				ret = GPSEvent.GPS_EVENT_TRACK_HEADER;
				break;
				
			default:
				// NIY - Add more as we implement Route and Track transmissions
				
		}
		
		return( ret );
	}
}
